package com.shanzhu.parking.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.shanzhu.parking.common.R;
import com.shanzhu.parking.common.ResultCode;
import com.shanzhu.parking.entity.Card;
import com.shanzhu.parking.entity.dto.CardOperationDTO;
import com.shanzhu.parking.entity.dto.CardOpenDTO;
import com.shanzhu.parking.entity.dto.CardRechargeDTO;
import com.shanzhu.parking.entity.query.CardQuery;
import com.shanzhu.parking.service.ICardService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;


import java.util.List;

/**
 * IC卡管理控制器
 */
@Slf4j
@Api(tags = "IC卡管理")
@RestController
@RequestMapping("/api/card")
@RequiredArgsConstructor
public class CardController {

    private final ICardService cardService;

    /**
     * 查询IC卡列表
     *
     * @param cardQuery 查询参数
     * @return 分页结果
     */
    @GetMapping("/list")
    @ApiOperation("查询IC卡列表")
    @SaCheckPermission("ic:card:list")
    public R<IPage<Card>> list(CardQuery cardQuery) {
        IPage<Card> page = cardService.getCardList(cardQuery);
        return R.success(page);
    }

    /**
     * 检查卡号是否存在
     *
     * @param cardNo 卡号
     * @return 检查结果
     */
    @GetMapping("/checkCardNo")
    @ApiOperation("检查卡号是否存在")
    @SaCheckPermission("ic:card:check")
    public R<Boolean> checkCardNo(@RequestParam String cardNo) {
        boolean exists = cardService.checkCardNoExists(cardNo);
        return R.success(exists);
    }

    /**
     * 搜索用户
     *
     * @param query 搜索关键词
     * @return 用户列表
     */
    @GetMapping("/searchUsers")
    @ApiOperation("搜索用户")
    @SaCheckPermission("ic:card:search")
    public R<List<Object>> searchUsers(@RequestParam String query) {
        List<Object> users = cardService.searchUsers(query);
        return R.success(users);
    }

    /**
     * 开卡
     *
     * @param dto 开卡信息
     * @return 开卡结果
     */
    @PostMapping("/openCard")
    @ApiOperation("开卡")
    @SaCheckPermission("ic:card:open")
    public R<Card> openCard(@RequestBody CardOpenDTO dto) {
        // 将Integer转为String，BigDecimal转为Double
        String icTypeStr = dto.getIcType() != null ? dto.getIcType().toString() : null;
        Double balanceDouble = dto.getBalance() != null ? dto.getBalance().doubleValue() : null;
        
        Card card = cardService.openCard(dto.getUsername(), dto.getCardNo(), icTypeStr, balanceDouble);
        if (card == null) {
            // 使用null作为data参数返回错误响应
            return R.error(null);
        }
        return R.success(card);
    }

    /**
     * 挂失卡片
     *
     * @param dto 卡片操作信息
     * @return 操作结果
     */
    @PostMapping("/cardLoss")
    @ApiOperation("挂失卡片")
    @SaCheckPermission("ic:card:loss")
    public R<Boolean> cardLoss(@RequestBody  CardOperationDTO dto) {
        boolean result = cardService.cardLoss(dto.getCardId());
        if (!result) {
            return R.error(false);
        }
        return R.success(true);
    }

    /**
     * 解除挂失
     *
     * @param dto 卡片操作信息
     * @return 操作结果
     */
    @PostMapping("/cardUnLoss")
    @ApiOperation("解除挂失")
    @SaCheckPermission("ic:card:unloss")
    public R<Boolean> cardUnLoss(@RequestBody CardOperationDTO dto) {
        boolean result = cardService.cardUnLoss(dto.getCardId());
        if (!result) {
            return R.error(false);
        }
        return R.success(true);
    }

    /**
     * 注销卡片
     *
     * @param dto 卡片操作信息
     * @return 操作结果
     */
    @PostMapping("/cardCancel")
    @ApiOperation("注销卡片")
    @SaCheckPermission("ic:card:cancel")
    public R<Boolean> cardCancel(@RequestBody  CardOperationDTO dto) {
        boolean result = cardService.cardCancel(dto.getCardId());
        if (!result) {
            return R.error(false);
        }
        return R.success(true);
    }

    /**
     * 充值
     *
     * @param dto 充值信息
     * @return 操作结果
     */
    @PostMapping("/recharge")
    @ApiOperation("充值")
    @SaCheckPermission("ic:card:recharge")
    public R<Boolean> recharge(@RequestBody  CardRechargeDTO dto) {
        boolean result = cardService.recharge(dto.getCardNo(), dto.getAmount());
        if (!result) {
            return R.error(false);
        }
        return R.success(true);
    }
}
